package pers.cnzdy.tutorial.Chapter7_Data.Section5_DataParse;

import android.util.Log;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class ParseHandler extends DefaultHandler {
    public static String TAG = "ParseHandler";

    private List<HashMap<String, String>> list = null; //解析后的XML内容
    private HashMap<String, String> map = null;        //存放当前记录的节点的XML内容
    private String currentTag = null;    //当前读取的XML节点
    private String currentValue = null;  //当前节点的XML文本值
    private String nodeName = null;      //解析的节点名称

    public ParseHandler(String nodeName) {
        this.nodeName = nodeName;
    }

    @Override
    public void startDocument() throws SAXException {
        // 存放解析XML后的数据
        list = new ArrayList<HashMap<String, String>>();
        Log.d(TAG, "开始解析XML文档");
    }

    @Override
    public void startElement(String uri, String localName, String qName,
                             Attributes attributes) throws SAXException {
        // 接收元素开始
        if (qName.equals(nodeName)) {
            map = new HashMap<String, String>();
        }

        // 如果存在属性值，则读取属性值。
        if (attributes != null && map != null) {
            for (int i = 0; i < attributes.getLength(); i++) {
                //读取的属性值插入到map中。
                map.put(attributes.getQName(i), attributes.getValue(i));
                Log.d(TAG, "读取属性值：" + attributes.getValue(i));
            }
        }
        currentTag = qName;
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        String value=new String(ch, start, length);
        Log.d(TAG, "找到一个值： " + value);

        // 接收标签中的数据。
        if (currentTag != null && map != null) {
            //获取当前节点的文本值，ch这个直接数组就是存放的文本值。
            currentValue = new String(ch, start, length);
            if (currentValue != null && !currentValue.equals("")
                    && !currentValue.equals("\n")) {
                map.put(currentTag, currentValue);
            }
        }
        // 读取完后清空当前节点的标签值和所包含的文本值。
        currentTag = null;
        currentValue = null;
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if (qName.equals(nodeName)) {
            list.add(map);
            // 清空map，开始新一轮读取。
            map = null;
        }
        Log.d(TAG, "结束解析XML文档");
    }

    public List<HashMap<String, String>> getList() {
        return list;
    }
}
